package br.unirio.octopus.visao.acoes;

import java.util.Date;
import java.util.List;

import org.apache.struts2.interceptor.validation.SkipValidation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.unirio.octopus.dominio.Jogo;
import br.unirio.octopus.dominio.Palpite;
import br.unirio.octopus.dominio.PalpiteVO;
import br.unirio.octopus.dominio.PrevisaoPalpiteVO;
import br.unirio.octopus.dominio.Usuario;
import br.unirio.octopus.excecao.ExcecaoDaAplicacao;
import br.unirio.octopus.servicos.IServicoDePalpite;
import br.unirio.octopus.servicos.IServicosOctopusPaul;
import br.unirio.octopus.util.UtilitarioDeDatas;

public class PalpiteAction extends AbstractAction{
	

	private List<PalpiteVO> jogos;
	
	@Autowired
	private IServicoDePalpite servicoDePalpite;
	
	@Autowired
	private IServicosOctopusPaul servicoDePrevisao;
		
	private Integer idDoPalpite;
	private Integer idDoJogo;
	
	private Palpite palpite;
	private Jogo jogo;
	
	private Date tempoParaOJogo;
	
	private PrevisaoPalpiteVO previsao;

	public PrevisaoPalpiteVO getPrevisao() {
		return previsao;
	}

	public void setPrevisao(PrevisaoPalpiteVO previsao) {
		this.previsao = previsao;
	}

	public String prepararPaginaDePalpites(){
		
		Usuario usuario = getUsuarioAutenticado();		
		jogos = servicoDePalpite.obterJogosEPalpitesDoUsuario(usuario);
		
		return SUCESSO;
	}

	public String prepararPaginaDeExibicaoDeJogo(){
		try {
			jogo = servicoDePalpite.obterJogoPorId(idDoJogo);
			//tempoParaOJogo = UtilitarioDeDatas.getInstancia().tempoRestanteEntreDatas(new Date(), jogo.getDiaEHorario());
			palpite = servicoDePalpite.obterPalpiteDeUsuarioPorIdDeJogo(getUsuarioAutenticado(), idDoJogo);
		} catch (ExcecaoDaAplicacao e) {
			addActionError(getText(e.getMensagem()));
		}
		return SUCESSO;
	}
	
	public String prepararPaginaDeExibicaoDeJogoComPrevisao(){
		try {
			jogo = servicoDePalpite.obterJogoPorId(idDoJogo);
			palpite = servicoDePalpite.obterPalpiteDeUsuarioPorIdDeJogo(getUsuarioAutenticado(), idDoJogo);
			previsao = servicoDePrevisao.preverResultadoDoJogoEntre(jogo.getPais1(), jogo.getPais2());
		} catch (ExcecaoDaAplicacao e) {
			addActionError(getText(e.getMensagem()));
		}
		return SUCESSO;
	}
	
	public String prepararPaginaDeExibicaoDeJogoFechado(){
		try {
			jogo = servicoDePalpite.obterJogoPorId(idDoJogo);
			palpite = servicoDePalpite.obterPalpiteDeUsuarioPorIdDeJogo(getUsuarioAutenticado(), idDoJogo);		
		} catch (ExcecaoDaAplicacao e) {
			addActionError(getText(e.getMensagem()));
		}
		return SUCESSO;
	}
	
	public String palpitar()
	{			
			if(idDoPalpite==null){
				return criarPalpite();
			}
			else{
				return atualizarPalpite();
			}
	}
	
	@SkipValidation
	public String criarPalpite(){
		palpite.setUsuario(getUsuarioAutenticado());
		jogo = servicoDePalpite.obterJogoPorId(idDoJogo);
		palpite.setJogo(jogo);
		try {
			servicoDePalpite.criarPalpite(palpite);
		} catch (ExcecaoDaAplicacao e) {
			addActionError(e.getMensagem());
		}
		return prepararPaginaDePalpites();
	}
	
	public String atualizarPalpite(){

	Palpite palpiteDeJogo = servicoDePalpite.obterPalpitePorId(idDoPalpite);
	palpiteDeJogo.setGolsPais1(palpite.getGolsPais1());
	palpiteDeJogo.setGolsPais2(palpite.getGolsPais2());
	servicoDePalpite.atualizarPalpite(palpiteDeJogo);

		return prepararPaginaDePalpites();
	}

	public List<PalpiteVO> getJogos() {
		return jogos;
	}

	public void setJogos(List<PalpiteVO> jogos) {
		this.jogos = jogos;
	}

	public Integer getIdDoPalpite() {
		return idDoPalpite;
	}

	public void setIdDoPalpite(Integer idDoPalpite) {
		this.idDoPalpite = idDoPalpite;
	}

	public Integer getIdDoJogo() {
		return idDoJogo;
	}

	public void setIdDoJogo(Integer idDoJogo) {
		this.idDoJogo = idDoJogo;
	}
	
	public Palpite getPalpite() {
		return palpite;
	}

	public void setPalpite(Palpite palpite) {
		this.palpite = palpite;
	}

	public Jogo getJogo() {
		return jogo;
	}

	public void setJogo(Jogo jogo) {
		this.jogo = jogo;
	}
	
	public Date getTempoParaOJogo() {
		return tempoParaOJogo;
	}

	public void setTempoParaOJogo(Date tempoParaOJogo) {
		this.tempoParaOJogo = tempoParaOJogo;
	}
	
	
}
